<?php

require_once 'BancoDeDados.php';
require_once 'Objeto.php';

class Colecao {

    private $cod_colecao;
    private $nome;
    private $vinculado;
    private $objeto;

    public function setCod_colecao(&$cod_colecao) {
        $this->cod_colecao = &$cod_colecao;
    }

    public function &getCod_colecao() {
        return $this->cod_colecao;
    }

    public function setNome(&$nome) {
        $this->nome = &$nome;
    }

    public function &getNome() {
        return $this->nome;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    private function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }

    /**
     *
     * @return Objeto
     */
    public function &getObjeto() {
        return $this->objeto;
    }

    public function setObjeto(Objeto &$objeto) {
        $this->objeto = &$objeto;
    }

    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Coleção existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into colecao (nome) values(?)');
        $result = $link->execute($stmt, array($this->nome));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from colecao where cod_colecao = ?');
        $result = $link->execute($stmt, array($this->cod_colecao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public static function listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from colecao');
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $colecao = new Colecao();
            $colecao->setCod_colecao($row['cod_colecao']);
            $colecao->setNome($row['nome']);
            $colecao->setVinculado($colecao->verificarVinculacao());
            $resultado[] = &$colecao;
            unset($colecao);
        }
        return $resultado;
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'nome' && $this->nome != $campo_valor) {
            $this->nome = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Coleção existente");
            }
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update colecao set ' . $campo_id . ' = ? where cod_colecao = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_colecao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    private function &validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_colecao from colecao where nome = ?', array($this->nome));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = 1;
        if ($result->numRows() > 0) {
            $resultado = 0;
        }
        return $resultado;
    }

    public static function consultar(Objeto &$objeto, &$cod_colecao) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from colecao where cod_colecao = ?', array($cod_colecao));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            return "Coleção inexistente";
        } elseif ($result->numRows() == 0) {
            return "Mais de um Coleção com o mesmo identificador, informe ao administrador";
        }
        $result->fetchInto($row);
        $colecao = new Colecao();
        $colecao->setCod_colecao($row['cod_colecao']);
        $colecao->setNome($row['nome']);
        $colecao->setObjeto($objeto);
        return $colecao;
    }

    private function verificarVinculacao() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_colecao from objeto where cod_colecao = ?', array($this->cod_colecao));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = 0;
        if ($result->numRows() > 0) {
            $resultado = 1;
        }
        return $resultado;
    }

    public function cadastrarObjeto() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_colecao from objeto where cod_colecao = ? and cod_interno = ?', array($this->cod_colecao, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() > 0) {
            throw new Exception('Coleção existente');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update objeto set cod_colecao = ? where cod_interno = ?');
        $result = $link->execute($stmt, array($this->cod_colecao, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function excluirObjeto() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update objeto set cod_colecao = null where cod_interno = ?');
        $result = $link->execute($stmt, array($this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

}
?>